package proyectoX.src.fabricas;

import java.util.Random;

import javax.swing.ImageIcon;

import proyectoX.src.aplicacion.Juego;
import proyectoX.src.entidades.Basica;
import proyectoX.src.entidades.Jefe;
import proyectoX.src.entidades.Kamikaze;
import proyectoX.src.entidades.Transporte;

/**
 * Fábrica para crear naves enemigas con distintos atributos y formaciones.
 *
 */
public class FactoryNavesEnemigas {

	protected Juego juego;
	protected Random generador;
	
	/**
	 * Crea el objeto pasándole un objeto de tipo Juego de parámetro.
	 * @param j Objeto Juego.
	 */
	public FactoryNavesEnemigas(Juego j) {
		juego = j;
		generador = new Random();
	}
	
	
	/**
	 * Crea una fila a la izquierda de la pantalla de 3 naves básicas.
	 */
	public void crearFilaIzquierdaBasica() {
		int posX = 50;
		int posY = -200;
		for (int i = 0; i < 3; i++) {
			crearBasica(posX, posY);
			posX += 70;
		}
	}
	
	/**
	 * Crea una fila a la derecha de la pantalla de 3 naves básicas.
	 */
	public void crearFilaDerechaBasica() {
		int posX = 450;
		int posY = -200;
		for (int i = 0; i < 3; i++) {
			crearBasica(posX, posY);
			posX -= 70;
		}
	}
	
	/**
	 * Crea una nave básica en la posición pasada por parámetro.
	 * @param x Posición x.
	 * @param y Posición y.
	 */
	public void crearBasica(int x, int y) {
		Basica m = crearBasicaGrafico();
		m.setLocation(x, y);
	}
	
	/**
	 * Crea una nave básica en una posición horizontal aleatoria y una posición vertical
	 * fuera de la pantalla. 
	 */
	public void crearBasica() {
		Basica m = crearBasicaGrafico();
		int posX = generador.nextInt(juego.getWidth()-juego.getWidthInterfazIconos()-m.getWidth()*2)+0;
		m.setLocation(posX, 0-this.juego.getHeight()+20);					
	}
	
	/**
	 * Crea la nave Básica con sus propiedades gráficas pero sin posición alguna.
	 * @return Nave básica creada.
	 */
	private Basica crearBasicaGrafico() {
		ImageIcon image = new ImageIcon(this.getClass().getResource("/proyectoX/sprites/basica.gif"));
		Basica m= new Basica(juego.getNivelActual(),image);
		m.setSize(image.getIconWidth(),image.getIconHeight()); 		
		m.setVisible(true);
		juego.agregarEnemiga(m);
		return m;
	}
	
	/**
	 * Crea una nave transporte en la posición pasada por parámetro y con un desplazamiento
	 * horizontal pasado por parámetro.
	 * @param x Posición x.
	 * @param y Posición y.
	 * @param mov Desplazamiento horizontal.
	 */
	public void crearTransporte(int x, int y, int mov) {
		Transporte m = crearTransporteGrafico();
		m.setLocation(x, y);
		m.setDespX(mov);
	}
	
	/**
	 * Crea una nave transporte en una posición horizontal aleatoria y una posición vertical
	 * fuera de la pantalla pero con un desplazamiento horizontal pasado por parámetro.
	 * @param mov Desplazamiento horizontal.
	 */
	public void crearTransporte(int mov) {
		Transporte m = crearTransporteGrafico();	
		int posX = generador.nextInt(juego.getWidth()-juego.getWidthInterfazIconos()-m.getWidth()*2)+0;
		m.setLocation(posX, 0-this.juego.getHeight()+20);	
		m.setDespX(mov);
	}
	
	/**
	 * Crea una nave transporte en una posición horizontal aleatoria y una posición vertical
	 * fuera de la pantalla pero con un desplazamiento horizontal pasado por parámetro.
	 * @param mov Desplazamiento horizontal.
	 */
	public void crearTransporte() {
		Transporte m = crearTransporteGrafico();
		int posX = generador.nextInt(juego.getWidth()-juego.getWidthInterfazIconos()-m.getWidth()*2)+0;
		m.setLocation(posX, 0-this.juego.getHeight()+20);						
	}
	
	/**
	 * Crea la nave transporte con sus propiedades gráficas pero sin posición alguna ni 
	 * desplazamiento horizontal definido.
	 * @return Nave transporte creada.
	 */
	private Transporte crearTransporteGrafico() {
		ImageIcon image = new ImageIcon(this.getClass().getResource("/proyectoX/sprites/transporte.gif"));
		Transporte m= new Transporte(juego.getNivelActual(),image);
		m.setSize(image.getIconWidth(),image.getIconHeight()); 			
		m.setVisible(true);
		juego.agregarEnemiga(m);
		return m;
	}

	/**
	 * Crea a la nave jefe en el centro de la pantalla pero a una altura en la queno es
	 * visible.
	 */
	public void crearJefe() {
		ImageIcon image = new ImageIcon(this.getClass().getResource("/proyectoX/sprites/jefe.png"));
		Jefe m= new Jefe(juego.getNivelActual(),image);
		m.setSize(image.getIconWidth(),image.getIconHeight()); 			
		m.setVisible(true);
		m.setLocation((juego.getWidth()-80)/2, -100);	
		juego.agregarEnemiga(m);
	}
	
	/**
	 * Crea a una nave kamikaze en una posición horizontal aleatoria pero por debajo de
	 * la posición mínima donde puede estar la nave jugadora.
	 */
	public void crearKamikaze() {
		Kamikaze m = crearKamikazeGrafico();
		int posX = generador.nextInt(juego.getWidth()-juego.getWidthInterfazIconos()-m.getWidth()*2)+0;					
		m.setLocation(posX, 450);
	}
	
	/**
	 * Crea la nave kamikaze con sus propiedades gráficas pero sin posición alguna.
	 * @return Nave kamikaze creada.
	 */
	private Kamikaze crearKamikazeGrafico() {
		ImageIcon image = new ImageIcon(this.getClass().getResource("/proyectoX/sprites/kamikaze.gif"));
		Kamikaze m= new Kamikaze(juego.getNivelActual(),image);
		m.setSize(image.getIconWidth(),image.getIconHeight()); 		
		m.setVisible(true);
		juego.agregarEnemiga(m);
		return m;
	}
	
	/**
	 * Crea un triángulo de naves de transporte que se va cerrando para luego abrirse
	 * quedando un triángulo inverso al original. El lado derecho pasa a ser el izquierdo
	 * y vice versa.
	 * 	A       A		   A A
	 *	 A     A    --->  A   A
	 *	  A   A			 A     A
	 *     A A  		A       A
	 */
	public void crearTrianguloNorteTransporte() {
		int posX = 250;
		int posY = -100;
		int offsetX = 30;
		for (int i = 0; i < 4; i++) {
			crearTransporte(posX+offsetX, posY, -1);
			crearTransporte(posX-offsetX, posY, 1);
			offsetX += 30;
			posY -= 40;
		}
		
	}
}
